/*
 * Rinde.java
 *
 */

package InterfazBD;

import Beans.*;
import java.sql.*;
import java.util.*;

/**
 *
 * @author Marco Sobrino
 */
public class Rinde 
{
    
    
    private BeanRinde datosRinde;
    private LinkedList<ResuSet> alumnosExamen;
    private LinkedList<ResuSet> alumnosRevision;
    private LinkedList<ResuSet> alumnosPlanilla;
    
    /**
     * Creates a new instance of Rinde
     */
    public Rinde()
    {
    }

    /**
     * Getter for property datosRinde.
     * @return Value of property datosRinde.
     */
    public BeanRinde getDatosRinde() 
    {
       return this.datosRinde;
    }

    /**
     * Setter for property datosRinde.
     * @param datosRinde New value of property datosRinde.
     */
    public void setDatosRinde(BeanRinde datosRinde) 
    {
       this.datosRinde = datosRinde;
    }

    /**
     * Agrega un registro cuando un alumno empieza a rendir
     */
    public void agregarRinde() throws Exception
    {
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement();
        stm.execute("INSERT INTO web.rinde (idAlumno, idExamen, puntaje, fecInicio, horaInicio, estado) values (" +
                    datosRinde.getIdAlumno() + ", " +
                    datosRinde.getIdExamen() + ", " +
                    datosRinde.getPuntaje()+ ", " +
                    "current_date, " +
                    "current_time, " +
                    "\'"+datosRinde.getEstado()+"\')" );                    
        stm.close();
        conexionBD.desconectar();
    }

    /**
     * Elimina un registro cuando un alumno empieza a rendir
     */
    public void quitarRinde() throws Exception
    {
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement();
        stm.execute("DELETE FROM web.rinde WHERE idAlumno = " + datosRinde.getIdAlumno() + 
                                           " AND idExamen = " + datosRinde.getIdExamen() );
        stm.close();
        conexionBD.desconectar();
    }
    
    /**Actualiza el puntaje cuando el alumno temina de rendir y pone la fecha y hora de finalizacion*/
    public void terminaRendir(int idAlumno, int idExamen) throws Exception{        
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement();
        
        ResultSet punTot = stm.executeQuery ("select sum(r.puntaje) " +
                "from web.respuesta as r inner join web.tema as t on r.idtema = t.idtema " +
                "where t.idexamen = "+idExamen+" and r.idalumno = "+idAlumno);
        
        double puntajeT = 0;
        if (punTot.next())
            puntajeT = punTot.getDouble(1);
        
        stm.execute("UPDATE web.rinde " +
                    "SET puntaje = "+puntajeT+", " +
                    "fecfin = current_date, "+
                    "horafin = current_time, "+
                    "estado = \'T\' "+
                    "WHERE idalumno = "+idAlumno+" and " +
                    "idexamen = "+idExamen);
        stm.close();
        conexionBD.desconectar();        
    }   
        
    /**Actualiza el puntaje cuando el profesor termina de corregir*/
    public void actualzarPuntaje(int idAlumno, int idExamen) throws Exception{        
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement();
        
        ResultSet punTot = stm.executeQuery ("select sum(r.puntaje) " +
                "from web.respuesta as r inner join web.tema as t on r.idtema = t.idtema " +
                "where t.idexamen = "+idExamen+" and r.idalumno = "+idAlumno);
        
        double puntajeT = 0;
        if (punTot.next())
            puntajeT = punTot.getDouble(1);
        
        stm.execute("UPDATE web.rinde " +
                    "SET puntaje = "+puntajeT+", " +                    
                    "estado = \'C\' "+
                    "WHERE idalumno = "+idAlumno+" and " +
                    "idexamen = "+idExamen);
        stm.close();
        conexionBD.desconectar();        
    }
    
    /**Obtiene el puntaje dado de un alumno en un examen*/
    public double obtenerPuntaje(int idAlumno, int idExamen) throws Exception{        
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement();
        
        ResultSet punTot = stm.executeQuery ("select * " +
                                             "from web.rinde " +
                                             "where idalumno = "+idAlumno+" and idexamen = "+idExamen);
        
        double puntajeT = 0;
        if (punTot.next())
            puntajeT = punTot.getDouble("puntaje");        
        
        stm.close();
        conexionBD.desconectar();        
        
        return puntajeT;
    }

    /**Obtiene los alumnos que rindieron una materia dada*/
    public void traerAlumnosExamen(int idExam) throws Exception{
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement();
        
        ResultSet alumnos = stm.executeQuery ("select r.idexamen,u.idusuario,u.apellido,u.nombre,u.cidentidad " +
                "from web.rinde as r " +
                "inner join web.usuario as u on r.idalumno = u.idusuario where r.idexamen = "+idExam+" "+
                "order by u.apellido");
        
        alumnosExamen = new LinkedList();
        
        while(alumnos.next()){
            ResuSet obj = new ResuSet();
            
            obj.SetColumna6(alumnos.getInt("idusuario"));
            obj.SetColumna1(alumnos.getString("nombre"));
            obj.SetColumna2(alumnos.getString("apellido"));
            obj.SetColumna7(alumnos.getInt("cidentidad"));
            obj.SetColumna8(alumnos.getInt("idexamen"));            
            alumnosExamen.add(obj);
        }
        
        stm.close();
        conexionBD.desconectar(); 
    }
    
    /**Crea la planilla de un examen*/
    public void traePlanilla(int idExam) throws Exception{
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        
        Statement stm = conn.createStatement();
        
        ResultSet alumnos = stm.executeQuery ("select R.idalumno, U.nombre, U.apellido, R.puntaje " +
                                              "from web.rinde as R inner join web.usuario as U on R.idalumno = U.idusuario " +
                                              "where R.idexamen ="+idExam+" order by U.apellido desc");
        
        alumnosPlanilla = new LinkedList();
        
        while(alumnos.next()){
            ResuSet obj = new ResuSet();
            
            obj.SetColumna6(alumnos.getInt("idalumno"));
            obj.SetColumna1(alumnos.getString("nombre"));
            obj.SetColumna2(alumnos.getString("apellido"));
            obj.SetColumna7(alumnos.getInt("puntaje"));                        
            alumnosPlanilla.add(obj);
        }
        
        stm.close();
        conexionBD.desconectar(); 
    }
    

    /**
     * Getter for property alumnosExamen.
     * @return Value of property alumnosExamen.
     */
    public LinkedList<ResuSet> getAlumnosExamen() {
        return this.alumnosExamen;
    }

    /**
     * Confirma la revision del examen de un alumno
     */
    public void confirmaRevision(int idAlumno, int idExamen) throws Exception{
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement();
        stm.execute("UPDATE web.rinde " +
                    "SET revision = \'S\' " +                                        
                    "WHERE idalumno = "+idAlumno+" and " +
                    "idexamen = "+idExamen);
        stm.close();
        conexionBD.desconectar(); 
    }
    
    /**
     * Confirma la revision del examen de un alumno
     */
    public void habilitaExamen(int idAlumno, int idExamen, String pin) throws Exception{
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement();
        stm.execute("UPDATE web.rinde " +
                    "SET pin = \'"+pin+"\' " +                                        
                    "WHERE idalumno = "+idAlumno+" and " +
                    "idexamen = "+idExamen);
        stm.close();
        conexionBD.desconectar(); 
    }
    
    /**
     * Confirma el pin introducido por el alumno para volver a rendir
     */
    public boolean compruebaPin(String pin, int idExamen, int idAlumno) throws Exception{
        boolean ok = false;
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        
        Statement stm = conn.createStatement();        
        ResultSet rsPin = stm.executeQuery ("select pin " +
                                            "from web.rinde " +
                                            "where idexamen = "+idExamen+" and " +
                                                   "idalumno = "+idAlumno);
        
        rsPin.next();
        String BDpin = rsPin.getString("pin");        
        stm.close();
        
        if (BDpin.equalsIgnoreCase(pin)){
            ok = true;
        
            Statement stm2 = conn.createStatement();
            stm2.execute("UPDATE web.rinde " +
                        "SET pin = null, estado = 'V' " +                                        
                        "WHERE idalumno = "+idAlumno+" and " +
                        "idexamen = "+idExamen);
            stm2.close();
        }
        
        conexionBD.desconectar();
        
        return ok;
    }    
    
    /**Obtiene los alumnos que pidieron revision en una materia dada*/
    public void traerAlumnosRevision(int idExam) throws Exception{
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement();
        
        ResultSet alumnos = stm.executeQuery ("select r.idexamen,u.idusuario,u.apellido,u.nombre,u.cidentidad, r.puntaje, r.revision " +
                                              "from web.rinde as r " +
                                              "inner join web.usuario as u on r.idalumno = u.idusuario " +
                                              "where r.idexamen = "+idExam+" and r.revision = \'S\' "+
                                              "order by u.apellido");
        
        alumnosRevision = new LinkedList();
        
        while(alumnos.next()){
            ResuSet obj = new ResuSet();
            
            obj.SetColumna6(alumnos.getInt("idusuario"));
            obj.SetColumna1(alumnos.getString("nombre"));
            obj.SetColumna2(alumnos.getString("apellido"));
            obj.SetColumna7(alumnos.getInt("cidentidad"));
            obj.SetColumna8(alumnos.getInt("idexamen"));
            obj.SetColumna3(""+alumnos.getDouble("puntaje"));
            
            alumnosRevision.add(obj);
        }
        
        stm.close();
        conexionBD.desconectar(); 
    }

    /**
     * Getter for property alumnosRevision.
     * @return Value of property alumnosRevision.
     */
    public LinkedList<ResuSet> getAlumnosRevision() {
        return this.alumnosRevision;
    }
    
    /**
     * Getter for property alumnosRevision.
     * @return Value of property alumnosRevision.
     */
    public LinkedList<ResuSet> getAlumnosPlanilla() {
        return this.alumnosPlanilla;
    }
}